package com.ruoyi.system.service.sz.impl;

import java.util.*;

import com.alibaba.fastjson2.JSON;
import com.ruoyi.common.core.domain.entity.SisSysOrgan;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.DictUtils;
import com.ruoyi.common.utils.ThreadPool;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.system.domain.sz.*;
import com.ruoyi.system.mapper.sz.SisSysOrganMapper;
import com.ruoyi.system.mapper.sz.SzPersonalMapper;
import com.ruoyi.system.service.sz.ISzPersonalService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.stream.Collectors;

import com.ruoyi.common.utils.StringUtils;
import org.springframework.transaction.annotation.Transactional;

import static com.ruoyi.common.constant.TimeLineConstants.*;


/**
 * 个人信息Service业务层处理
 * 
 * @author ruoyi
 * @date 2024-03-14
 */
@Service
@Slf4j
public class SzPersonalServiceImpl implements ISzPersonalService
{
    @Autowired
    private SzPersonalMapper szPersonalMapper;

    @Value("${ext.userUrl}")
    private String userUrl;

    @Autowired
    private SisSysOrganMapper sisSysOrganMapper;


    /**
     * 查询个人信息
     * 
     * @param personalId 个人信息主键
     * @return 个人信息
     */
    @Override
    public SzPersonal selectSzPersonalByPersonalId(Long personalId)
    {
        return szPersonalMapper.selectSzPersonalByPersonalId(personalId);
    }

    /**
     * 查询个人信息列表
     * 
     * @param szPersonal 个人信息
     * @return 个人信息
     */
    @Override
    public List<SzPersonal> selectSzPersonalList(SzPersonal szPersonal)
    {
        return szPersonalMapper.selectSzPersonalListBySearchValue(szPersonal);
    }

    /**
     * 新增个人信息
     * 
     * @param szPersonal 个人信息
     * @return 结果
     */
    @Transactional
    @Override
    public int insertSzPersonal(SzPersonal szPersonal)
    {
        szPersonal.setCreateTime(DateUtils.getNowDate());
        String nation = szPersonal.getNation();
        if(StringUtils.isNotBlank(nation)){
            szPersonal.setNationName(DictUtils.getDictLabel(SZ_STAFF_NATION, nation));
        }
        String politicalStatus = szPersonal.getPoliticalStatus();
        if(StringUtils.isNotBlank(politicalStatus)){
            szPersonal.setPoliticalName(DictUtils.getDictLabel(SZ_STAFF_POLITICAL, politicalStatus));
        }
        int rows = szPersonalMapper.insertSzPersonal(szPersonal);
        insertSzPersonalWork(szPersonal,0);
        return rows;
    }

    /**
     * 修改个人信息
     * 
     * @param szPersonal 个人信息
     * @return 结果
     */
    @Transactional
    @Override
    public int updateSzPersonal(SzPersonal szPersonal)
    {
        szPersonal.setUpdateTime(DateUtils.getNowDate());
//        deleteAndInsert(szPersonal);
        insertSzPersonalWork(szPersonal,1);
        return szPersonalMapper.updateSzPersonal(szPersonal);
    }

    private void deleteAndInsert(SzPersonal szPersonal) {
        Long personalId = szPersonal.getPersonalId();
        szPersonalMapper.deleteSzPersonalWorkByPersonalId(personalId);
        szPersonalMapper.deleteSzPersonalEducationByPersonalId(personalId);
        szPersonalMapper.deleteSzPersonalFamilyByPersonalId(personalId);
        szPersonalMapper.deleteSzPersonalFileByPersonalId(personalId);
        insertSzPersonalWork(szPersonal,0);
    }

    /**
     * 批量删除个人信息
     * 
     * @param personalIds 需要删除的个人信息主键
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteSzPersonalByPersonalIds(Long[] personalIds)
    {
        szPersonalMapper.deleteSzPersonalWorkByPersonalIds(personalIds);
        szPersonalMapper.deleteSzPersonalFamilyByPersonalIds(personalIds);
        szPersonalMapper.deleteSzPersonalEducationByPersonalIds(personalIds);
        szPersonalMapper.deleteSzPersonalRecordByPersonalIds(personalIds);
        szPersonalMapper.deleteSzPersonalFileByPersonalIds(personalIds);
        return szPersonalMapper.deleteSzPersonalByPersonalIds(personalIds);
    }

    /**
     * 删除个人信息信息
     * 
     * @param personalId 个人信息主键
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteSzPersonalByPersonalId(Long personalId)
    {
        szPersonalMapper.deleteSzPersonalWorkByPersonalId(personalId);
        szPersonalMapper.deleteSzPersonalFamilyByPersonalId(personalId);
        szPersonalMapper.deleteSzPersonalRecordByPersonalId(personalId);
        szPersonalMapper.deleteSzPersonalEducationByPersonalId(personalId);
        szPersonalMapper.deleteSzPersonalFileByPersonalId(personalId);
        return szPersonalMapper.deleteSzPersonalByPersonalId(personalId);
    }
    @Transactional
    @Override
    public boolean updatePersonalAvatar(SzPersonal szPersonal) {
        return szPersonalMapper.updatePersonalAvatar(szPersonal) > 0;
    }
    @Transactional
    @Override
    public int updateSzPersonalRecord(SzPersonal szPersonal) {
        String status = szPersonal.getStatus();
        if(StringUtils.isNotBlank(status)){
            szPersonalMapper.updateSzPersonal(szPersonal);
        }
        Long personalId = szPersonal.getPersonalId();
        szPersonalMapper.deleteSzPersonalRecordByPersonalId(personalId);
        szPersonalMapper.deleteSzPersonalFileByPersonalIdAndType(personalId);
        insertSzPersonalWork(szPersonal,1);

        callExt(szPersonal);

        return 1;
    }

    private void callExt(SzPersonal szPersonal) {
        String status = szPersonal.getStatus();
        Long personalId = szPersonal.getPersonalId();
        if(PERSONAL_STATUS_1.equals(status)) {
            ThreadPool threadPool = new ThreadPool(1);
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    SzPersonal szPersonal1 = szPersonalMapper.selectSzPersonalByPersonalId(personalId);
                    Map<String, String> map = new HashMap<>();
                    map.put("userName", szPersonal1.getPersonalName());
                    String sex = szPersonal1.getSex();
                    if ("0".equals(sex)) {
                        map.put("userSex", "man");
                    } else {
                        map.put("userSex", "woman");
                    }
                    map.put("objuid", String.valueOf(personalId));

                    SzPersonalRecord szPersonalRecord = szPersonal.getSzPersonalRecord();

                    if (null != szPersonalRecord) {
                        map.put("orgId", szPersonalRecord.getUnit());
                    }
                    map.put("userTel", szPersonal1.getPhone());
                    map.put("idcardno", szPersonal1.getIdNumber());
                    String jsonString = JSON.toJSONString(map);

                    String s = HttpUtils.sendPostRequestByHttpclient(userUrl, jsonString);

                    log.info("调用外部人员信息保存接口，返回值：{}", s);

                }
            });
        }
    }

    public static void main(String[] args) {
        String params = "{\"objuid\":\"1\",\"orgId\":\"1722876202799509505\",\"userName\":\"张三\",\"userSex\":\"man\",\"userTel\":\"13910011000\",\"idcardno\":\"110101200001011234\"}";
        String s = HttpUtils.sendPostRequestByHttpclient("http://192.168.50.220:8080/gateway/sis-uwsp/openApi/anonSaveUserInfo", params);
        ///sz/personal/updateRecord
//        String params = "{\"personalId\":16,\"szPersonalRecord\":{\"unit\":\"test\",\"currentPosition\":\"你上课\",\"employmentDate\":\"2018-01-01\",\"securityLevel\":\"1\",\"jobTitle\":\"是的方式\",\"personnelStatus\":\"1\",\"onJobDate\":\"2024-03-18\",\"trainMethod\":\"0\",\"fingerprintStatus\":\"1\",\"faceStatus\":\"33\",\"cardStatus\":\"\",\"index\":1},\"szPersonalFileList\":[{\"fileName\":\"接口文档3_20240315175712A001.xlsx\",\"fileType\":\"1\",\"fileContent\":\"/profile/upload/2024/03/15/接口文档3_20240315175712A001.xlsx\",\"index\":1},{\"fileName\":\"接口文档1_20240315175717A002.xlsx\",\"fileType\":\"2\",\"fileContent\":\"/profile/upload/2024/03/15/接口文档1_20240315175717A002.xlsx\",\"index\":1}]}";
//
//        String s = HttpUtils.sendPostRequestByHttpclient("http://localhost:8080/sz/personal/updateRecord", params);

        System.out.println(s);

    }




    /**
     * 新增个人信息-工作经历信息
     * 
     * @param szPersonal 个人信息对象
     */
    public void insertSzPersonalWork(SzPersonal szPersonal,int fileType)
    {
        List<SzPersonalWork> szPersonalWorkList = szPersonal.getSzPersonalWorkList();
        List<SzPersonalEducation> szPersonalEducationList = szPersonal.getSzPersonalEducationList();
        List<SzPersonalFamily> szPersonalFamilyList = szPersonal.getSzPersonalFamilyList();
        SzPersonalRecord szPersonalRecord = szPersonal.getSzPersonalRecord();
        List<SzPersonalFile> szPersonalFileList = szPersonal.getSzPersonalFileList();
        Long personalId = szPersonal.getPersonalId();
        if (StringUtils.isNotNull(szPersonalWorkList))
        {
            List<SzPersonalWork> list = new ArrayList<SzPersonalWork>();
            for (SzPersonalWork szPersonalWork : szPersonalWorkList)
            {
                szPersonalWork.setPersonalId(personalId);
                list.add(szPersonalWork);
            }
            if (list.size() > 0)
            {
                szPersonalMapper.batchSzPersonalWork(list);
            }
        }

        if (null != szPersonalRecord)
        {
            List<SzPersonalRecord> list = new ArrayList<SzPersonalRecord>();
            szPersonalRecord.setPersonalId(personalId);
            String securityLevel = szPersonalRecord.getSecurityLevel();
            if(StringUtils.isNotBlank(securityLevel)){
                szPersonalRecord.setSecurityName(DictUtils.getDictLabel(SZ_CLASSIFY_GRADE,securityLevel));
            }
            String personnelStatus = szPersonalRecord.getPersonnelStatus();
            if(StringUtils.isNotBlank(personnelStatus)){
                szPersonalRecord.setPsName(DictUtils.getDictLabel(SZ_STAFF_STATUS,personnelStatus));
            }
            String jobTitle = szPersonalRecord.getJobTitle();
            if(StringUtils.isNotBlank(jobTitle)){
                szPersonalRecord.setJobName(DictUtils.getDictLabel(SZ_COMMON_DUTY,jobTitle));
            }
            String unit = szPersonalRecord.getUnit();

            if(StringUtils.isNotBlank(unit)){
                SisSysOrgan organ = sisSysOrganMapper.selectSisSysOrganByObjuid(unit);
                if(null != organ){
                    szPersonalRecord.setUnitName(organ.getOrgName());
                }
            }

            list.add(szPersonalRecord);
            if (list.size() > 0)
            {
                szPersonalMapper.batchSzPersonalRecord(list);
            }
        }

        if (StringUtils.isNotNull(szPersonalEducationList))
        {
            List<SzPersonalEducation> list = new ArrayList<SzPersonalEducation>();
            for (SzPersonalEducation szPersonalWork : szPersonalEducationList)
            {
                szPersonalWork.setPersonalId(personalId);
                list.add(szPersonalWork);
            }
            if (list.size() > 0)
            {
                szPersonalMapper.batchSzPersonalEducation(list);
            }
        }

        if (StringUtils.isNotNull(szPersonalFamilyList))
        {
            List<SzPersonalFamily> list = new ArrayList<SzPersonalFamily>();
            for (SzPersonalFamily szPersonalWork : szPersonalFamilyList)
            {
                szPersonalWork.setPersonalId(personalId);
                list.add(szPersonalWork);
            }
            if (list.size() > 0)
            {
                szPersonalMapper.batchSzPersonalFamily(list);
            }
        }

        if (StringUtils.isNotNull(szPersonalFileList))
        {
            List<SzPersonalFile> list = new ArrayList<SzPersonalFile>();
            for (SzPersonalFile szPersonalWork : szPersonalFileList)
            {
                String fileType1 = szPersonalWork.getFileType();
                if(0 == fileType) {
                    if("0".equals(fileType1)){
                        szPersonalWork.setPersonalId(personalId);
                        list.add(szPersonalWork);
                    }
                }else{
                    if(!"0".equals(fileType1)){
                        szPersonalWork.setPersonalId(personalId);
                        list.add(szPersonalWork);
                    }
                }
            }
            if (list.size() > 0)
            {
                szPersonalMapper.batchSzPersonalFile(list);
            }
        }
    }
}
